import axios from 'axios'
import { Toast } from 'vant'
import store from '@/store/index'
import bigInt from 'json-bigint'
import { exchangeTokenAPI } from '@/api/userAPI.js'
import router from '@/router/index.js'

// 自定义处理大数的方法
const transBigInt = data => {
  if (!data) return ''
  return bigInt.parse(data)
}

// 调用 axios.create() 方法，创建 axios 的实例对象
const instance = axios.create({
  // 请求根路径
  baseURL: 'http://toutiao-app.itheima.net',
  transformResponse: [transBigInt]
})

// 添加请求拦截器
instance.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么

  // 展示 loading 效果
  Toast.loading({
    message: '加载中...',
    duration: 0
  })

  const tokenStr = store.state.tokenInfo.token

  if (tokenStr) {
    config.headers.Authorization = 'Bearer ' + tokenStr
  }

  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
instance.interceptors.response.use(function (response) {
  // 对响应数据做点什么

  // 隐藏 loading 效果
  Toast.clear()

  return response
}, async function (error) {
  // 在请求失败的时候，关闭 loading 提示效果
  Toast.clear()
  try {
    const tokenInfo = store.state.tokenInfo

    // 如果有响应的结果，并且响应的状态码是 401，则证明 Token 过期了
    if (error.response && error.response.status === 401 && tokenInfo.refresh_token) {
      console.log('进行换取token的操作')

      const { data: res } = await exchangeTokenAPI(tokenInfo.refresh_token)
      if (res.message === 'OK') {
        // 更换 token
        store.commit('updateTokenInfo', { token: res.data.token, refresh_token: tokenInfo.refresh_token })

        return instance(error.config)
      }
    }
  } catch {
    // 进入 catch 说明 token 和 refresh_token 都失效了
    // 清空 local 和 vuex
    store.commit('clearState')
    // 强制跳转到登录页
    router.push('/login?pre=' + router.currentRoute.fullPath)
  }

  // 对响应错误做点什么
  return Promise.reject(error)
})

export default instance
